<!-- 
    大致原理：
        点击获取验证码之后，获取当前的时间戳，然后加上倒计时需要的秒数，就是结束时的时间戳，
        把结束时的时间戳储存在local中，页面挂载时就去获取local中的结束时间戳，如果有的话，就计算剩余秒数，继续倒计时。
 -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./vue.js"></script>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }

        body {
            width: 100vw;
            height: 100vh;
            display: flex;
            justify-content: center;
            align-items: center;
        }

        button {
            height: 25px;
        }
    </style>
</head>
<body>
    <div id="root">
        <button v-show="isShow" @click="changeShow();getCode();setInter()">点击获取验证码</button>
        <span v-show="!isShow">({{second}})S后重试</span>
    </div>
    <script>
        new Vue({
            el: "#root",
            data() {
                return {
                    isShow: true,
                    second: 0,
                }
            },
            methods: {
                changeShow() {
                    // 改变状态
                    this.isShow = !this.isShow;
                    // 在local中写入状态
                    localStorage.setItem('isShow', this.isShow)
                },
                getCode() {
                    // 获取当前系统时间
                    const now = new Date().getTime();
                    // 计算结束时的时间戳（单位毫秒）
                    const end = now + 10000;
                    // 写入结束时的时间戳
                    localStorage.setItem('second', end);
                    // 设置倒计时秒数
                    this.second = 10;
                },
                setInter() {
                    // 设置定时器开启倒计时
                    let timer = setInterval(() => {
                        this.second--;
                        // 倒计时结束工作
                        if (this.second == 0) {
                            // 清除定时器
                            clearInterval(timer);
                            // 清除local中储存的时间戳
                            localStorage.removeItem('second');
                            // 改变状态
                            this.changeShow();
                        }
                    }, 1000);
                }
            },
            mounted() {
                // 读取结束时的时间戳
                const end = localStorage.getItem('second');
                // 判断local中是否存在时间戳，存在才进行后续操作
                if (end) {
                    // 获取并设置按钮状态(注意此时获取下来的是一个字符串，要把它转成表达式)
                    this.isShow = eval(localStorage.getItem('isShow'));
                    // 获取当前系统时间戳
                    const now = new Date().getTime();
                    // 计算剩余时间
                    this.second = Math.ceil((end - now) / 1000);
                    // 调用倒计时
                    this.setInter();
                }
            },
        })
    </script>
</body>

</html>